Arduino + ESP32 高分开源项目推荐
作为一个 ESP32 重度用户,并且一直使用 Arduino 框架开发嵌入式应用的爱好者,在过去开发的项目过程中使用过不少开源项目,这里稍微总结一下比较有意思的,以及比较有用的开源项目列表。
其中一些项目不光是固件方面的程序,也包含了对应的硬件设计,可以当作一个电子 DIY 入门的学习项目。
开源项目集合
awesome-esp
项目地址:https://github.com/agucova/awesome-esp
一个国外爱好者收集的 ESP32/ESP8266 开源项目集合,主要偏完整的固件应用。
固件应用
这里是一些完整的固件开源项目,通常也会包含一个完整的硬件项目,不管是用来学习硬件开发,还是学习嵌入式软件开发,都是很好的例子。
ESPHome
项目地址:https://github.com/esphome/esphome
算是最流行的开源智能家居固件之一了,通过编写 YAML 配置文件的方式来快速集成各种传感器、开关、屏幕等设备到一个固件中,并且内置了 Home Assistant 等智能家居平台的支持,可以一键添加到这些平台中。
要使用 ESPHome,基于上只需要了解大概的 GPIO 知识,I2C 以及 SPI 总线的概念就可以上手了,传感器或者其他外设的驱动都已经包含在固件中,并且官方文档也包含了详细的配置教程。
之前就使用 ESPHome 快速搭建了两个应用:
超简单 DIY - AirCube 空气检测站
https://xujiwei.com/blog/2022/12/aircube-diy-environment-monitor-station/
使用 ESPHome + INA219 模块构建一个简易功率计
https://xujiwei.com/blog/2022/10/build-power-meter-with-esphome-and-ina219/
X-Knob
项目地址:https://github.com/SmallPond/X-Knob
基于 smartknob 和 X-Track 的一个开源无刷电机旋钮固件,相比原版的自定义绘制界面,X-Knob 使用 LVGL 渲染界面,扩展性和开发的便捷性要好很多,并且作者也搭建了一套 UI 生命周期管理,在页面管理上更加舒适。
WLED
项目地址:https://github.com/Aircoookie/WLED
开源的 WS2812B 灯带控制固件,配套有 App 和 Web 控制界面,可以提供各种灯光切换效果,使用流水灯、彩虹灯之类,并且固件还提供了 API 来控制灯带,理论上淘宝上随便买一个滴胶 WS2812B 灯带再加上一个 NodeMCU/ESP8266 开发板,就可以代替 YeeLight 那些卖得巨贵的灯带了。
AWTRIX
项目地址:https://github.com/awtrix/AWTRIX2.0-Controller
网红像素钟,包含了各种应用,天气预报、空气质量、时间、日期、各个平台粉丝数等,我复刻了两个版本,一个直接使用淘宝上购买的 32x8 WS2812 像素屏,使用的 5050 封装灯珠,体积比较大,另外一个就是自己画板子做了个小尺寸的,使用 3528 封装的灯珠。
AWTRIX 配套的服务器功能还挺强大的,不光可以安装应用,还支持画图标等,也有 API 来推送通知,这样可以拿 AWTRIX 像素钟当一个通知中心。
这个项目是使用 ESP8266 的,目前已经停止维护了,作者新开了一个坑使用的 ESP32,不过功能和生态并不如旧版强大,主要是可以单机运行,不再需要单独部署一个服务端,但是如果想要扩展更多功能,还是需要例如 Home Assistant 或者 NodeRED 这样的服务端程序。
AWTRIX Light:https://github.com/Blueforcer/awtrix-light
HoloCubie_AIO
项目地址:https://github.com/ClimbSnail/HoloCubic_AIO
由稚晖君在很早的时候推出的透明小电视,算是一个很不错的桌面小摆件。这个项目是第三方在原版硬件基础之上推出的独立固件,相比原版包含了更多功能,还有上位机程序可以控制小电视。
mongoose-os
项目地址:https://github.com/cesanta/mongoose-os
一个面向 IoT 设备使用的固件,集成了很多 IoT 设备常用的功能,例如 OTA 固件更新以及远程管理等,并且内置了很多大平台的 IoT 能力支持,例如 AWS IoT、Google IoT Core、Microsoft Azure。
这个固件的另外一大特色就是,它可以使用 JavaScript 来编写业务代码,对于熟悉 JavaScript 的工程师来说,可以完全不关心固件是如何编译、打包的,只需要专注于业务逻辑的编写。
open-ip-kvm
项目地址:https://github.com/Nihiue/open-ip-kvm
一个开源的 IP-KVM,类似于 Pi-KVM,但是 Pi-KVM 的使用成本太高了,这个开源项目使用了 Arduino Leonardo 开发板模拟 HID 设备,并使用 MS2109 采集卡来采集目标设备的 HDMI 输出画面,最终使用 nodejs + Web 的方式给用户提供操作界面。
整个项目还是比较完整的,相比 Pi-KVM,整体搭建成本可以低一个数量级。
基础库
ArduinoJson
项目地址:https://github.com/bblanchon/ArduinoJson
对于带网络请求的应用来说,JSON 的解析和生成是必不可少的,基本上大多数接口都使用 JSON 来作为 HTTP API 的请求和响应格式。
ArduinoJson 支持静态和动态分配内存,在 ESP32 上,基本上不太用担心内存占用问题,解析速度也还不错,使用静态解析时,需要注意对象是否在引用有效范围内,否则可能会出现数据错乱的情况。
Nanopb
项目地址:https://github.com/nanopb/nanopb
Protobuf 在一些长连接通信的场合也是一种经常使用的通信格式,体积小、解析速度快、向前兼容性好使得它的应用范围相当广泛,在嵌入式应用中,可能有一些场合也需要解析 Protobuf,使用 Nanopb 就可以用于解析这些数据。
Arduino-SHA-1-Hash
项目地址:https://github.com/mr-glt/Arduino-SHA-1-Hash
对比过几个库之后觉得比较好用的 SHA-1 Hash 生成库,通常用于 API 请求生成签名。
arduino-crypto
项目地址:https://github.com/intrbiz/arduino-crypto
测试过比较好用的 AES 加解密以及 SHA256-HMAC 生成库,在有些需要使用 HMAC 的场合时,就可以使用这个库。
开发辅助
EspArduinoExceptionDecoder
项目地址:https://github.com/janLo/EspArduinoExceptionDecoder
对于 ESP32 应用,在出现 crash 的时候,通常只会给一个包含了各种代码地址的 coredump,这个时候就可以使用这个工具,结合本地编译的固件映像,将那一堆十六进制的代码地址转换为实际源代码中的位置,从来更方便地排查异常是怎么发生的。
外设驱动
ClickEncoder
项目地址:https://github.com/soligen2010/encoder
旋转编码器驱动,支持点击、双击、长按等事件检测,基于计时器,适用性比较好。
Adafruit_GPS
项目地址:https://github.com/adafruit/Adafruit_GPS
GPS 协议解析库,支持 NMEA-0183,在 ESP32 上编译比较顺利,其他几个库会有这样那样的问题。
不过需要注意的是,这个库并不支持所有 NMEA 指令,在使用时需要查看实际数据是否符合预期。
INA219_WE
项目地址:https://github.com/wollewald/INA219_WE
电流/功率计 INA219 芯片的驱动库,代码比较整洁,并且支持设置采样电阻大小,这样在实际使用过程中,可以通过降低采样精度的方式来增加电流采样范围。
MT6701-Arduino-Library
项目地址:https://github.com/S-LABc/MT6701-Arduino-Library
MT6701 磁编码器驱动库,在 smartknob 项目中可以作为 TLV493D 的替代。
OneButton
项目地址:https://github.com/mathertel/OneButton
支持多种触发方式的按键检测库,以及支持单击、双击、长按等事件的检测。
IRremoteESP8266
项目地址:https://github.com/crankyoldgit/IRremoteESP8266
红外遥控协议库,可以用来开发一个万能遥控硬件,支持很多种设备,包含一些国内的家电,例如美的空调,这样可以精确控制空调的温度、风速等选项,而不是只能重放从遥控器获得的红外指令。
网络通信
ESPxWebFIMgr
项目地址:https://github.com/holgerlembke/ESPxWebFlMgr
可以实现通过网页管理 ESP32/ESP8266 内置 SPIFFS 中文件的库,可以实现下载、删除、重命名等操作,并且可以显示 SPIFFS 中可用空间。
加上这个库就可以实现最简单的文件管理功能了,比如在 SPI Flash 中记录的数据,可以通过这个方式来同步到电脑上。
ESPAsync_WiFiManager
项目地址:https://github.com/khoih-prog/ESPAsync_WiFiManager
最常用的通过 Web 配置 ESP32 Wi-Fi 连接的库,在没有连接上 Wi-Fi 时,启动一个 Hotspot,用户连接上之后可以设置需要连接的 Wi-Fi 接入点名称、密码等,集成了已知 SSID 扫描等能力。
不过这个库有一个不太好的地方,在默认实现中,即使已经有保存了之前连接过的网络,还是会扫描一次已知网络,并去跟之前连接过的 BSSID 进行匹配,这导致在启动时连接速度不太理想。这个时候可以直接调用 ESP32 官方库的 WiFi.begin 方法来绕开这个过程,实现更快的连接速度。
NTPClient
项目地址:https://github.com/arduino-libraries/NTPClient
对于 ESP32 系列来说,如果不想加一个 RTC 芯片来保存时间,使用 NTP 获取时间是一个不错的选择,这个库就可以用于同步 NTP 时间并且获取当前时间,使用也比较简单。
arduinoWebSockets
项目地址:https://github.com/Links2004/arduinoWebSockets
需要连接 WebSocket 服务端时,可以使用这个库,对比了其他几个库,这个算比较好用的。
ArduinoHttpClient
项目地址:https://github.com/arduino-libraries/ArduinoHttpClient
相对内置的 HTTPClient,这个库可以支持更多方法去发送 HTTP 请求,封装也比较好,并且支持设置 Header、支持 Basic Auth 等。
EspSoftwareSerial
项目地址:https://github.com/plerup/espsoftwareserial
ESP32 只有 2 个 UART 可用,如果想要连接更多 UART 外设,这个时候可以使用软件模拟的 UART,这个库算是比较常用的了。
OTA
esp32-http-update
项目地址:https://github.com/suculent/esp32-http-update
ESP32 Arduino 内置了 OTA 支持,但是只能使用 HTTPS 地址,不支持 HTTP URL,如果要使用 HTTPS 地址,对于 ESP32 来说,需要配置一堆证书以及网站签名等信息,使用起来比较麻烦,这个库支持直接通过 HTTP URL 更新固件,固件的完整性可以通过其他 HTTPS API 来传递 MD5 等签名来验证。
图形图象
GxEPD2
项目地址:https://github.com/ZinggJM/GxEPD2
SPI 接口电子墨水屏驱动库,支持很多尺寸的 SPI 接口电子墨水屏,使用比较简单。
ArduinoMenu
项目地址:https://github.com/neu-rah/ArduinoMenu
通过配置的方式来生成多级菜单,支持菜单包含设置项,以及支持通过编码器来完成设置,并且可以配置多个输出,在调试的时候也比较方便,比如同时在 0.96 OLED 和 Serial 中输出菜单。
TFT_eSPI
项目地址:https://github.com/Bodmer/TFT_eSPI
TFT LCD 驱动库,支持常见 ST7789V、GC9A01 等主控。
lvgl
项目地址:https://github.com/lvgl/lvgl
跨平台 GUI 框架,内置了相当多的控件,例如 Tab、输入框、下拉框等,以及包含了软键盘等,并且可以集成多种输入设备,例如鼠标、键盘、编码器等,可以用来实现一个完整的嵌入式设备界面程序。
总结
Arduino 还是一个比较方便的开发框架,配置 ESP32 强大的性能和自带联网的特性,开发一些联网设备应用还是很方便的,希望这些开源项目对大家进入电子 DIY 有所帮助。
点击阅读原文前往带链接的文章页面
↓↓↓↓↓